#ifndef __CS_CLAMP_H
#define __CS_CLAMP_H

template<class T>
inline T clamp(const T& value) 
{
 const T a = static_cast<T>(0);
 const T b = static_cast<T>(1);
 if(value < a) return a;
 else if(b < value) return b;
 return value;
}

template<class T>
inline T clamp(const T& value, const T& b) 
{
 const T a = static_cast<T>(0);
 if(b < a) {
    if(value < b) return b;
    else if(value > a) return a;
   }
 else {
    if(value < a) return a;
    else if(b < value) return b;
   }
 return value;
}

template<class T>
inline T clamp(const T& value, const T& a, const T& b) 
{
 if(b < a) {
    if(value < b) return b;
    else if(a < value) return a;
   }
 else {
    if(value < a) return a;
    else if(b < value) return b;
   }
 return value;
}

template<class T>
inline T clamp(const T& value, const T& a, const T& b, const T& u, const T& v) 
{
 if(b < a) {
    if(value < b) return v;
    else if(a < value) return u;
   }
 else {
    if(value < a) return u;
    else if(b < value) return v;
   }
 return value;
}

#endif
